package com.abner.design.patterns.singleton;

/**
 * 双重检查
 * @Author: abner
 * @Date: 2022-04-22-11:10
 **/
public class SingletonType5 {

    public static void main(String[] args) {
        Singleton5 instance1 = Singleton5.getInstance5();
        Singleton5 instance2 = Singleton5.getInstance5();
        System.out.println(instance1 == instance2);
        System.out.println(instance1.hashCode() == instance2.hashCode());
    }
}

/**
 * 优缺点说明：
 *  1) Double-Check 概念是多线程开发中常使用到的，如代码中所示，我们进行了两次 if (singleton == null)检查，这样就可以保证线程安全了。
 *  2) 这样，实例化代码只用执行一次，后面再次访问时，判断 if (singleton == null)，直接 return 实例化对象，也避免的反复进行方法同步.
 *  3) 线程安全；延迟加载；效率较高
 *  4) 结论：在实际开发中，推荐使用这种单例设计模式
 */
class Singleton5 {

    private static volatile Singleton5 singleton5;

    private Singleton5() {};

    public static Singleton5 getInstance5() {
        if(null == singleton5) {
            synchronized (Singleton5.class) {
                if(null == singleton5) {
                    singleton5 = new Singleton5();
                }
            }
        }
        return singleton5;
    }
}
